/*	Nama file		: Event.cpp
	Deskripsi		: Body type dan prototype primitif type Event
	Nama pembuat	: Muhammad Ghufron Mahfudhi/23512066
	Hari / Tanggal	: Rabu, 31 Oktober 2012
*/

#include "Event.h"

/** Getter dan Setter **/
int Event::GetNum()
/* Mengembalikan Nomor ID Event E*/
{
	return this->eNum;
}

string Event::GetName()
/* Mengembalikan Nama Event E */
{
	return this->eName;
}

Point Event::GetVenue()
/* Mengembalikan Tempat Event E */
{
	return this->eVenue;
}

DateTime Event::GetTime()
/* Mengembalikan DateTime Event E */
{
	return this->eTime;
}

ListOfName Event::GetLNames()
/* Mengembalikan daftar nama yang terlibat dalam Event E */
{
	return this->eLNames;
}

void Event::SetNum(const int& newNo)
/* Proses : Mengubah Nomor ID Event E */
/* I.S : E sudah terbuat, newNo terdefinisi */
/* F.S : Nomor Event E berisi newNo */
{
	this->eNum = newNo;
}

void Event::SetName(const string& newName)
/* Proses : Mengubah Nama Event E */
/* I.S : E sudah terbuat, newName terdefinisi */
/* F.S : Nama Event E berisi newName */
{
	this->eName = newName;
}

void Event::SetVenue(const Point& newPlace)
/* Proses : Mengubah Tempat Event E */
/* I.S : E sudah terbuat, newPlace terdefinisi */
/* F.S : Tempat Event E berisi newPlace */
{
	this->eVenue = newPlace;
}

void Event::SetTime(const DateTime& newDateTime)
/* Proses : Mengubah DateTime Event E */
/* I.S : E sudah terbuat, newDateTime terdefinisi */
/* F.S : DateTime Event E berisi newDateTime */
{
	this->eTime = newDateTime;
}

void Event::SetLNames(const ListOfName& newNameList)
/* Proses : Mengubah daftar nama yang terlibat dalam Event E */
/* I.S : E sudah terbuat, newNameList terdefinisi */
/* F.S : NameList Event E berisi newNameList */
{
	this->eLNames = newNameList;
}

/** 4 sekawan **/
Event::Event()
/* Constructor: membuat Event dengan elemen default */
{
	eNum = 0;
	eName = "Event";
	eVenue = Point();
	eTime = DateTime();
	eLNames = ListOfName();
}

Event::Event(int newNum, string newName, Point newPlace, DateTime newDateTime, ListOfName newNameList)
/* Constructor: membuat Event dari elemen-elemen yang terdefinisi */
/* Prekondisi: semua parameter telah valid */
{
	eNum = newNum;
	eName = newName;
	eVenue = newPlace;
	eTime = newDateTime;
	eLNames = newNameList;
}

Event::Event(const Event& E)
/* Copy constructor: membuat Event dari Event yang sudah ada */
{
	eNum = E.eNum;
	eName = E.eName;
	eVenue = E.eVenue;
	eTime = E.eTime;
	eLNames = E.eLNames;
}

Event& Event::operator=(const Event& E)
/* Operator assignment Event */
{
	eNum = E.eNum;
	eName = E.eName;
	eVenue = E.eVenue;
	eTime = E.eTime;
	eLNames = E.eLNames;
	return *this;
}

Event::~Event()
/* Destruktor Event */
{

}

/** Method Baca/Tulis **/
void Event::BacaEvent (int newNum)
/* Proses : Membaca komponen Event dari masukan pengguna */
/* I.S. Sembarang */
/* F.S. Event terdefinisi dan merupakan Event yang valid */
{
	/* KAMUS */
	string newName;
	string temp;
	Point newVenue;
	DateTime newDT;
	ListOfName newLNames;
	
	/* ALGORITMA */
	cout << "\n**INPUT DATA EVENT YANG AKAN DITAMBAHKAN**\n";
	cout << "Nomor event : " << newNum << endl;
	/* masih bermasalah di getline */
	cout << "Masukkan nama event : "; //cin.ignore(); 
	getline(cin, newName);
	cout << "Membuat tempat event :\n";
	newVenue.Read();
	cout << "Membuat waktu event :\n";
	newDT.Read();
	getline(cin,temp);
	cout << "Membuat nama peserta event :\n";
	newLNames.Read();
	
	*this = Event(newNum, newName, newVenue, newDT, newLNames);
	
}

void Event::TulisEvent()
/* Proses : Menulis nilai setiap komponen Event ke layar */
/* I.S. Event terdefinisi */
/* F.S. Nilai Event ditulis ke layar beserta komponen-komponennya */
{
	cout << "\nNomor event\t: " << GetNum() << endl;
	cout << "Nama event\t: " << GetName() << endl;
	cout << "Tempat event\t: "; GetVenue().Print(); cout << endl;
	cout << "Waktu event\t: "; GetTime().Print(); cout << endl;
	cout << "List nama\t: "; GetLNames().Print(); cout << endl << endl;
}

/** Operator Lebih Kecil (<) **/
int operator<(Event E1, Event E2)
/* Mengembalikan 1 jika E1 lebih kecil dari pada E2 */
{
	return E1.GetTime() < E2.GetTime();
}
